#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int t,n,k;
map<pair<int,int>,int> mp[2];
int main(void){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int now=0;
        int ans=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&k);
            mp[now].clear();
            int x,y;
            for(int i=0;i<k;i++){
                scanf("%d%d",&x,&y);
                pair<int,int> p=make_pair(x,y);
                if(mp[now^1].count(p)){
                    mp[now][p]=mp[now^1][p]+1;
                }
                else{
                    mp[now][p]=1;
                }
                ans=max(ans,mp[now][p]);
            }
            //滚动数组的思想，就是只用两个map来表示当前和上一个状态，然后如果当前的p在上一个状态中出现，即连续，就存入并加1
            //如果没有出现，存入为1  ^1用于0和1的切换
            now^=1;
        }
        printf("%d\n",ans);
    }
    return 0;
}